package com.testing;

import com.testing.sqlUtil.MysqlUtils;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Classname ${NAME}
 * @Description 类型说明
 * @Date 2020/12/30 15:57
 * @Created by 勾勾
 */
@javax.servlet.annotation.WebServlet(name = "login")
public class login extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/plain;charset=utf-8");
        response.setCharacterEncoding("UTF-8");

        //获取接口中的参数
        String user = request.getParameter("username");
        String pwd = request.getParameter("password");
        System.out.println(user);
        System.out.println(pwd);
//        response.getWriter().append("post方法被调用了，").append("这是VIP08的登录接口。");

        //空指针，当没有传username的时候, 下面Tomcat Localhost Log中报错：java.lang.NullPointerException
        //boolean roy=user.equals("Roy");
        //调用参数变量时，记得判断是否为空，否则可能出现空指针
        //服务器运行异常，也就是出现HTTP状态码500 internal server error
        //int i=user.length();

        //服务器随着请求的建立，创建一个session
        HttpSession session = request.getSession();

        //设置session的有效时长为10s，10s之后，自动失效
        session.setMaxInactiveInterval(120);

        //获取请求中携带的cookie
        Cookie[] cookies = request.getCookies();
        //遍历cookie数组
        if(cookies!=null){
        for (Cookie cookie : cookies) {
            System.out.println("本次cookie的内容是："+cookie.getName() + cookie.getValue() + cookie.getMaxAge());
        }
    }


        //获取sessionId，也就是本次会话编号
        String sessionId = session.getId();
        System.out.println("本次session的id是："+session.getId());

        //判断本次session中是否已经有人登录过了,在登录成功之后，会设置loginName键值对
        //如果登录的时候，session中已经有值了，则说明已经有人登录了
        if (session.getAttribute("loginName") != null) {
            response.getWriter().append("{\"status\":-5,\"msg\":\"" + "已经有用户登录过了，不能重复" + "\"}");
            //结束接口的调用，如果有人登录过，不往后走验证登录
            return;
        } else {
            //现在没有办法去实现数据库，但是还需要这样一个接口来完成登录的操作，所以先对参数做简单的调试，写一个mock的接口
            //制订规则：写一个登录的简单逻辑
            if (user != null && user.length() > 0 && pwd != null && pwd.length() > 0) {
                if (user.length() < 17 && user.length() > 1 && pwd.length() < 17 && pwd.length() > 2) {
                    //解决项目中数据库查询出现sql注入的问题：
                    //第二种方法：先判断是否有特殊字符。
                    //通过使用正则表达式来完成判断。
                    //判断是否包含特殊字符
                    //制定特殊字符的规则
                    //[^\w-_] ^表示取非   用户名和密码只要不是\\w(英文字母、数字、) 以及- 和 _ 的都认为是特殊字符
                    Pattern specialWords = Pattern.compile("[^\\w-_\\u4E00-\\u9FFF]");
                    //查找user和pwd中是否包含特殊字符
                    Matcher specialUser = specialWords.matcher(user);
                    Matcher specialPwd = specialWords.matcher(pwd);
                    //如果user和pwd中找不到特殊字符
                    if (!specialUser.find() && !specialPwd.find()) {
                        //调用mysql查询进行验证的方法验证登录是否成功
                        MysqlUtils ggMysql = new MysqlUtils();
                        ggMysql.createConnector();

                        if (ggMysql.proCheckLogin(user, pwd)) {
                            //{"status":0,"msg":"恭喜您，登录成功"}
                            response.getWriter().append("{\"status\":1,\"msg\":\"" + "恭喜您，登录成功" + "\"}");

                            //登录成功之后在session中以键值对的形式来记录信息 键"loginName",值"user"
                            session.setAttribute("loginName", user);
                            //登录成功之后，返回JSESSIONID的cookie，设置生命周期不为session有效
                            //设置JSESSIONID就为本次session的id值
                            Cookie sessionCookie=new Cookie("JSESSIONID",sessionId);
//                            //设置生命周期为30s
                            sessionCookie.setMaxAge(120);
//                            //返回JSESSIONID的cookie
                            response.addCookie(sessionCookie);



                        } else {
                            response.getWriter().append("{\"status\":-1,\"msg\":\"" + "用户名密码错误" + "\"}");
                        }
                    } else {
                        response.getWriter().append("{\"status\":-2,\"msg\":\"" + "用户名密码中不能包含特殊字符" + "\"}");
                    }
                } else {
                    response.getWriter().append("{\"status\":-3,\"msg\":\"" + "用户名和密码的长度需要是3-16位" + "\"}");
                }
            } else {
                response.getWriter().append("{\"status\":-4,\"msg\":\"" + "用户名密码不能为空" + "\"}");
            }
//        response.getWriter().append(", " + "post方法被调用了，").append("这是VIP08的登录接口。");
        }
    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        response.setContentType("text/plain;charset=utf-8");
        response.setCharacterEncoding("UTF-8");

        //获取接口中的参数
        String user = request.getParameter("username");
        String pwd = request.getParameter("password");
//        response.getWriter().append("get方法被调用了").append("用户名是：").append("密码是:");
//        response.getWriter().append("get方法被调用了").append("用户名是："+user).append("密码是:"+pwd);

        //制订规则：
        if (user != null && user.length() > 0 && pwd != null && pwd.length() > 0) {
            if (user.length() < 17 && user.length() > 1 && pwd.length() < 17 && pwd.length() > 1) {

                //调用mysql查询进行验证的方法验证登录是否成功
                MysqlUtils ggMysql = new MysqlUtils();
                ggMysql.createConnector();

                if (ggMysql.checkLogin(user, pwd)) {
                    response.getWriter().append("恭喜您，登录成功");
                } else {
                    response.getWriter().append("用户名密码错误");
                }
            } else {
                response.getWriter().append("用户名和密码的长度需要是3-16位");
            }
        } else {
            response.getWriter().append("用户名密码不能为空");
        }
        response.getWriter().append("get方法被调用了").append("用户名是：" + user).append("密码是:" + pwd);
    }
}
